home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / tptool.lbr / CHAPTER5.PQS / chapter5.pas
Pascal/Delphi Source File  |  1985-06-03  |  3KB  |  133 lines

  1. {$A-}
  2. PROGRAM CHAPTER5;
  3. {$I TOOLU.PAS}
  4. {$I FPRIMS.PAS}
  5.  
  6.  
  7. PROCEDURE FIND;
  8.  
  9. VAR
  10.   ARG,LIN,PAT:XSTRING;
  11.  
  12. FUNCTION GETPAT(VAR ARG,PAT:XSTRING):BOOLEAN;
  13. BEGIN
  14.   GETPAT:=(MAKEPAT(ARG,1,ENDSTR,PAT)>0)
  15. END;
  16.  
  17.  
  18. BEGIN
  19.   IF(NOT GETARG(2,ARG,MAXSTR))THEN
  20.     ERROR('Usage: find pattern');
  21.   IF (NOT GETPAT(ARG,PAT)) THEN
  22.     ERROR('FIND: illegal pattern');
  23.   WHILE(GETLINE(LIN,STDIN,MAXSTR))DO
  24.     IF (MATCH(LIN,PAT))THEN
  25.       PUTSTR(LIN,STDOUT)
  26. END;
  27.  
  28. PROCEDURE CHANGE;
  29. CONST
  30.   DITTO=255;
  31. VAR
  32.   LIN,PAT,SUB,ARG:XSTRING;
  33.  
  34. FUNCTION GETPAT(VAR ARG,PAT:XSTRING):BOOLEAN;
  35. BEGIN
  36.   GETPAT:=(MAKEPAT(ARG,1,ENDSTR,PAT)>0)
  37. END;
  38.  
  39. FUNCTION GETSUB(VAR ARG,SUB:XSTRING):BOOLEAN;
  40.  
  41. FUNCTION MAKESUB(VAR ARG:XSTRING; FROM:INTEGER;
  42.   DELIM:CHARACTER; VAR SUB:XSTRING):INTEGER;
  43. VAR I,J:INTEGER;
  44.    JUNK:BOOLEAN;
  45. BEGIN
  46.   J:=1;
  47.   I:=FROM;
  48.   WHILE (ARG[I]<>DELIM) AND (ARG[I]<>ENDSTR) DO BEGIN
  49.     IF(ARG[I]=ORD('&')) THEN
  50.       JUNK:=ADDSTR(DITTO,SUB,J,MAXPAT)
  51.     ELSE
  52.       JUNK:=ADDSTR(ESC(ARG,I),SUB,J,MAXPAT);
  53.     I:=I+1
  54.   END;
  55.   IF (ARG[I]<>DELIM) THEN
  56.     MAKESUB:=0
  57.   ELSE IF (NOT ADDSTR(ENDSTR,SUB,J,MAXPAT)) THEN
  58.     MAKESUB:=0
  59.   ELSE
  60.     MAKESUB:=I
  61. END;
  62.  
  63. BEGIN
  64.   GETSUB:=(MAKESUB(ARG,1,ENDSTR,SUB)>0)
  65. END;
  66.  
  67. PROCEDURE SUBLINE(VAR LIN,PAT,SUB:XSTRING);
  68. VAR
  69.   I, LASTM, M:INTEGER;
  70.   JUNK:BOOLEAN;
  71.  
  72.  
  73. PROCEDURE PUTSUB(VAR LIN:XSTRING; S1,S2:INTEGER;
  74.   VAR SUB:XSTRING);
  75. VAR
  76.   I,J:INTEGER;
  77.   JUNK:BOOLEAN;
  78. BEGIN
  79.   I:=1;
  80.   WHILE (SUB[I]<>ENDSTR) DO BEGIN
  81.     IF(SUB[I]=DITTO) THEN
  82.       FOR J:=S1 TO S2-1 DO
  83.         PUTC(LIN[J])
  84.       ELSE
  85.         PUTC(SUB[I]);
  86.       I:=I+1
  87.   END
  88. END;
  89.  
  90. BEGIN
  91.   LASTM:=0;
  92.   I:=1;
  93.   WHILE(LIN[I]<>ENDSTR) DO BEGIN
  94.     M:=AMATCH(LIN,I,PAT,1);
  95.     IF (M>0) AND (LASTM<>M) THEN BEGIN
  96.       PUTSUB(LIN,I,M,SUB);
  97.       LASTM:=M
  98.     END;
  99.     IF (M=0) OR (M=I) THEN BEGIN
  100.       PUTC(LIN[I]);
  101.       I:=I+1
  102.     END
  103.     ELSE
  104.       I:=M
  105.     END
  106. END;
  107.  
  108. BEGIN
  109.   IF(NOT GETARG(2,ARG,MAXSTR)) THEN
  110.     ERROR('Usage: change from [to]');
  111.   IF (NOT GETPAT(ARG,PAT)) THEN
  112.     ERROR('CHANGE: illegal "from" pattern');
  113.   IF (NOT GETARG(3,ARG,MAXSTR)) THEN
  114.     ARG[1]:=ENDSTR;
  115.   IF(NOT GETSUB(ARG,SUB)) THEN
  116.     ERROR('CHANGE: illegal "to" string');
  117.   WHILE (GETLINE(LIN,STDIN,MAXSTR)) DO
  118.     SUBLINE(LIN,PAT,SUB)
  119. END;
  120.  
  121. PROCEDURE COMMAND;
  122. BEGIN
  123.        IF (GlobalArg1='change')THEN CHANGE
  124.   ELSE IF (GlobalArg1='find')THEN FIND
  125.   ELSE ERROR('Chap 5: can''t happen');
  126. END;
  127.  
  128. BEGIN
  129.   COMMAND;
  130.   ENDCMD;
  131. END.
  132.  
  133.